package com.facade;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import com.dao.CondicaoPagamentoDao;
import com.dao.ContaReceberDao;
import com.dao.ItemVendaDao;
import com.dao.ProdutoDao;
import com.dao.VendaDao;
import com.model.CondicaoPagamento;
import com.model.ContaReceber;
import com.model.ItemVenda;
import com.model.Parcela;
import com.model.Produto;
import com.model.Venda;

public class VendaFacade implements Serializable {
	private static final long serialVersionUID = 1L;
	
	private VendaDao vendaDao = new VendaDao();

	public void createVenda(Venda venda, List<ItemVenda> listaItem) {
		vendaDao.beginTransaction(); 
		CondicaoPagamentoDao daoCP = new CondicaoPagamentoDao();
		daoCP.joinTransaction();
		CondicaoPagamento cp = daoCP.findByPrimaryKey(venda.getCondicaoPagamento());
		venda.setCondicaoPagamento(cp);
		try {
			vendaDao.save(venda);
			System.out.println("Venda salva");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Erro ao salvar a venda");
		}
	
		ItemVendaDao daoItem = new ItemVendaDao();
		ProdutoDao daoProduto = new ProdutoDao();
		Produto produto = new Produto();
		for (ItemVenda itemVenda : listaItem) {
			itemVenda.setVenda(venda);
			try {
				
				daoItem.joinTransaction();
				daoItem.save(itemVenda);
				System.out.println("itemVenda salvo");
				daoProduto.joinTransaction();
				produto = daoProduto.findByPrimaryKey(itemVenda.getProduto());
				produto.setQuantidade(produto.getQuantidade()- itemVenda.getQuantidade());
				try {					
					daoProduto.update(produto);
				} catch (Exception e) {
					e.printStackTrace();
					System.out.println("Erro ao atualizar o produto");
				}
			} catch (Exception e) {
				e.printStackTrace();				
				System.out.println("Erro ao salvar o itemVenda");
			}	
		}
		
		ContaReceberDao daoConta = new ContaReceberDao();
		daoConta.joinTransaction();
		List<ContaReceber> listaConta = this.calculaValorParcela(venda.getCondicaoPagamento().getListaParcela(), venda);
		for (ContaReceber contaReceber : listaConta) {
			try {
				daoConta.save(contaReceber);
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("Erro ao salvar a conta a receber");
			}
		}		
		vendaDao.commitAndCloseTransaction();
	}
	
	public List<ContaReceber> calculaValorParcela(List<Parcela> listaParcela, Venda venda) {
		ContaReceber cr = new ContaReceber();
		List<ContaReceber> lista = new ArrayList<ContaReceber>();
		for (Parcela parcela : listaParcela) {
			Calendar dtVencimento = Calendar.getInstance();
			cr.setValor(venda.getValorTotal() * (parcela.getPercentual()/100));			
			dtVencimento.setTime(venda.getDtEmissao());
			dtVencimento.add(Calendar.DAY_OF_MONTH, parcela.getDias());						
			cr.setDtVencimento(dtVencimento.getTime());
			lista.add(cr);
		}
		return lista;
	}
	
	public void deleteVenda(Venda venda){
		vendaDao.beginTransaction();
		Venda persistedVendaWithIdOnly = vendaDao.findReferenceOnly(venda.getIdVenda());
		vendaDao.delete(persistedVendaWithIdOnly);
		vendaDao.commitAndCloseTransaction();
		
	}

	public Venda findVenda(int vendaId) {
		vendaDao.beginTransaction();
		Venda venda = vendaDao.find(vendaId);
		vendaDao.closeTransaction();
		return venda;
	}
	
	public List<Venda> findByProduto(Venda venda, Produto produto) {
		vendaDao.beginTransaction();
		List<Venda> vendas = vendaDao.findByProduto(venda, produto);
		vendaDao.closeTransaction();
		return vendas;
	}

	public List<Venda> listAll() {
		vendaDao.beginTransaction();
		List<Venda> result = vendaDao.findAll();
		vendaDao.closeTransaction();

		return result;
	}
	
	
	public void save(Venda venda) {
		vendaDao.beginTransaction();
		CondicaoPagamentoDao daoCP = new CondicaoPagamentoDao();
		daoCP.joinTransaction();
		CondicaoPagamento cp = daoCP.findByPrimaryKey(venda.getCondicaoPagamento());
		venda.setCondicaoPagamento(cp);
		try {
			vendaDao.save(venda);
			vendaDao.commit();
			
//		ItemVendaFacade itemVendaFacade = new ItemVendaFacade();
//		ProdutoFacade produtoFacade = new ProdutoFacade();
//		Produto produto = new Produto();
//		for (ItemVenda itemVenda : listaItem) {
//			itemVenda.setVenda(venda);
//			try {			
//				itemVendaFacade.createItemVenda(itemVenda);
//				produto = produtoFacade.findByPrimaryKey(itemVenda.getProduto());
//				produto.setQuantidade(produto.getQuantidade()- itemVenda.getQuantidade());
//				try {					
//					produtoFacade.updateProduto(produto);					
//				} catch (Exception e) {
//					e.printStackTrace();
//					System.out.println("Erro ao atualizar o produto");
//				}
//			} catch (Exception e) {
//				e.printStackTrace();				
//				System.out.println("Erro ao salvar o itemVenda");
//			}	
//		}		
//		ContaReceberFacade contaReceberFacade = new ContaReceberFacade();
//		List<ContaReceber> listaConta = this.calculaValorParcela(venda.getCondicaoPagamento().getListaParcela(), venda);
//		for (ContaReceber contaReceber : listaConta) {
//			try {
//				contaReceberFacade.createContaReceber(contaReceber);
//			} catch (Exception e) {
//				e.printStackTrace();
//				System.out.println("Erro ao salvar a conta a receber");
//			}
//		}		
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("Erro ao salvar a venda");
		} finally {
			vendaDao.closeTransaction();
		}	
		
	}
	

}